#include "ble_uart.h"
#include "driver_iomux.h"
#include "driver_system.h"
#include "driver_uart.h"
#include "driver_plf.h"
#include "co_printf.h"
#include <string.h>
#include "data_send.h"

static uint16_t uart_meter_flag = 0; // 缓存串口数据长度标志位
static uint8_t Uart_RX[200] = {0};   // 缓存串口数据

__attribute__((section("ram_code"))) void uart1_isr_ram(void)
{

    uint8_t int_id;//必须要用的参数
    volatile struct uart_reg_t *uart_reg = (volatile struct uart_reg_t *)UART1_BASE;

    int_id = uart_reg->u3.iir.int_id;

    if (int_id == 0x04 || int_id == 0x0c) /* Receiver data available or Character time-out indication */
    {
        //			co_printf("ok0");
        Uart_RX[uart_meter_flag] = uart_reg->u1.data;//储存的数据
        uart_meter_flag++;
        //			co_printf("ok1");
        if (Uart_RX[uart_meter_flag - 2] == 0x0d && Uart_RX[uart_meter_flag - 1] == 0x0a)
        {
            co_printf("%s\r\n", Uart_RX);
            Uart_RX[uart_meter_flag] = '\0';
//                       if (strstr((const char *)Uart_RX, "AT+UI=") != NULL)
//                       {
            							co_printf("ok\r\n");
                         UART_To_BLE(Uart_RX,uart_meter_flag);
//                       }

            //         }

					

            uart_meter_flag = 0;
            memset(Uart_RX, 0, sizeof Uart_RX); // 清空缓存
        }
    }
    else if (int_id == 0x06) // 接收线路中断//这里的东西我并不理解
    {
               uart_reg->u3.iir.int_id = int_id;
               uart_reg->u2.ier.erlsi = 0;
        volatile uint32_t line_status = uart_reg->lsr;
    }
}

//__attribute__((section("ram_code"))) void uart1_isr_ram(void)
//{
//    uint8_t int_id;
//    uint8_t c;
//    volatile struct uart_reg_t *uart_reg = (volatile struct uart_reg_t *)UART1_BASE;

//    int_id = uart_reg->u3.iir.int_id;

//    if(int_id == 0x04 || int_id == 0x0c )   /* Receiver data available or Character time-out indication */
//    {
////	      Uart_RX[uart_meter_flag] = uart_reg->u1.data;
////        uart_meter_flag++;
//        while(uart_reg->lsr & 0x01)
//        {
//            c = uart_reg->u1.data;
//            uart_putc_noint_no_wait(UART1,c);
//        }
////           uart_meter_flag = 0;
////           memset(Uart_RX, 0, sizeof Uart_RX);// 清空缓存
//    }
//    else if(int_id == 0x06)
//    {
//        //uart_reg->u3.iir.int_id = int_id;
//        //uart_reg->u2.ier.erlsi = 0;
//        volatile uint32_t line_status = uart_reg->lsr;
//    }
//}

//__attribute__((section("ram_code"))) void uart1_isr_ram(void)
//{
//    uint8_t int_id;
//    // mac_addr_t mac_addr1 = {{0x78, 0x56, 0X34, 0X12, 0xD0, 0x0B}};
////    	mac_addr_t mac_addr1 = {{0x54, 0x13, 0X39, 0X30, 0x38, 0xC8}};
//    volatile struct uart_reg_t *uart_reg = (volatile struct uart_reg_t *)UART1_BASE;
//    int_id = uart_reg->u3.iir.int_id;
//    if (int_id == 0x04 || int_id == 0x0c) /* Receiver data available or Character time-out indication */
//    {

//        Uart_RX[uart_meter_flag] = uart_reg->u1.data;
//        uart_meter_flag++;
//        if (Uart_RX[uart_meter_flag - 2] == 0x0d && Uart_RX[uart_meter_flag - 1] == 0x0a)
//        {
//            Uart_RX[uart_meter_flag] = '\0';
//            // ######################
//            if (strstr((const char *)Uart_RX, "AT+MAC=") != NULL)
//            {
//                uint8_t *j = strchr((const char *)Uart_RX, '=');
//                if (j != NULL)
//                {
//                    j++;

//                    for (int u = 0; u <= 5; u++)
//                    {
//                        char hexStr[3];
//                        hexStr[0] = j[10 - 2 * u];
//                        hexStr[1] = j[10 - 2 * u + 1];
//                        hexStr[2] = '\0';
////                        mac_addr1.addr[u] = (int)strtol(hexStr, NULL, 16);
//                    }
//                    //					char* equalSign = strchr(Uart_RX, '=');
//                    //    if (equalSign!= NULL) {
//                    //        equalSign++;
//                    //        int length = strlen(equalSign);
//                    //        if (length >= 12) {
//                    //            for (int i = 0; i < 6; i++) {
//                    //                sscanf(equalSign + 2 * i, "%2X", &mac_addr1.addr[5 - i]);
//                    //            }
//                    //        }
//                }

//                //        for (int p = 0; p < 6; p++) {
//                //            printf("0x%02X, ", mac_addr1.addr[p]);
//                //        }
//                //		}
//                //		####################
//                // 找到了AT+MAC
////                printf("The string %s contains AT+MAC\n", Uart_RX);

//                // gap_start_conn(&mac_addr1, GAP_ADDR_TYPE_PUBLIC, 20 * 1.25, 20 * 1.25, 0, 600);
//            }
//            else if (strstr((const char *)Uart_RX, "AT+UI=") != NULL)
//            {
//							co_printf("ok\r\n");
////                fasong();
//            }
//						 else if (strstr((const char *)Uart_RX, "AT+IU=") != NULL)
//            {
//							co_printf("okkkk\r\n");
//
////							uint8_t *p_data = "a3f5g8h2k9m1n6p4";
////							uint16_t i = 15;
////                network_gatt_report_notify(ooo[0],p_data,i);
//            }

//
//            else if (strstr((const char *)Uart_RX, "AT") != NULL)
//            {
//                // 找到了AT
////                printf("OK\r\n");
////                gap_start_conn(&mac_addr1, GAP_ADDR_TYPE_PUBLIC, 20 * 1.25, 20 * 1.25, 0, 600);

//                // co_printf("LINK_NUM = %d\r\n", gap_get_connect_num());
//                // {
//
//                // }
//            }
//            else
//            {
//                // 都不包含

////							network_gatt_report_notify(ooo[0],Uart_RX,uart_meter_flag);
//            }

//            uart_meter_flag = 0;
//            memset(Uart_RX, 0, sizeof Uart_RX);
//        }
//    }
//    else if (int_id == 0x06)
//    {

//        uart_reg->u3.iir.int_id = int_id;
//        uart_reg->u2.ier.erlsi = 0;
//        volatile uint32_t line_status = uart_reg->lsr;
//    }
//}

// __attribute__((section("ram_code"))) void uart1_isr_ram(void)
// {
//    uint8_t int_id;
//     volatile struct uart_reg_t *uart_reg = (volatile struct uart_reg_t *)UART1_BASE;

//     int_id = uart_reg->u3.iir.int_id;

//     if(int_id == 0x04 || int_id == 0x0c )   /* Receiver data available or Character time-out indication */
//     {

//        Uart_RX[uart_meter_flag] = uart_reg->u1.data;
//        uart_meter_flag++;
//        if (Uart_RX[uart_meter_flag - 2] == 0x0d && Uart_RX[uart_meter_flag - 1] == 0x0a)
//        {
//            Uart_RX[uart_meter_flag] = '\0';

//            uart_meter_flag = 0;
//            memset(Uart_RX, 0, sizeof Uart_RX);
//        }

//     }
//     else if(int_id == 0x06)//接收线路中断//这里的东西我并不理解
//     {
//        uart_reg->u3.iir.int_id = int_id;
//        uart_reg->u2.ier.erlsi = 0;
//         volatile uint32_t line_status = uart_reg->lsr;
//     }

// }

void UART_Init(void)
{
    system_set_port_pull(GPIO_PA2, true);
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_2, PORTA2_FUNC_UART1_RXD);
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_3, PORTA3_FUNC_UART1_TXD);
    uart_init(UART1, BAUD_RATE_115200);
    NVIC_EnableIRQ(UART1_IRQn);
    co_printf("\r\nuart0 demo\r\n");

    // system_set_port_pull(GPIO_PA2, true);
    // system_set_port_mux(GPIO_PORT_A, GPIO_BIT_2, PORTA2_FUNC_UART1_RXD);
    // system_set_port_mux(GPIO_PORT_A, GPIO_BIT_3, PORTA3_FUNC_UART1_TXD);
    // //uart_init(UART1, BAUD_RATE_115200);
    // uart_param_t param =
    // {
    //     .baud_rate = 115200,
    //     .data_bit_num = 8,
    //     .pari = 0,
    //     .stop_bit = 1,
    // };
    // uart_init1(UART1, param);

    // NVIC_EnableIRQ(UART1_IRQn);
    // co_printf("uart1 demo\r\n");
}
